var _ = require("lodash");
// _.xor([arrays])
// 获取集合中不共有的元素，就是这个元素只在所有的数组中出现过一次
// 也就是这几个集合的对称差
let arr1 = [1, 2];
let arr2 = [2, 3];
let arr3 = [4, 3];
let a = _.xor(arr1, arr2, arr3);
// console.log(a);

// 注意这个方法和union不同
// 方法则用于合并两个或多个数组，并返回一个新数组，其中包含所有唯一的元素。
// 这意味着重复的元素只会被包含一次
// 获取所有数组的交集，就是他们都共有的元素,使用的方法是intersection
let b = _.union(arr1, arr2, arr3);
// console.log(b);

// _.xorBy([arrays], [iteratee=_.identity])
// 对所有的元素进行一次迭代函数的操作，然后根据新生成的值进行比较
// 最终决定保留具体的对称差
let c = _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);
// console.log(c);
let d = _.xorBy([{ x: 1 }], [{ x: 2 }, { x: 1 }], "x");
// console.log(d);

// _.xorWith([arrays], [comparator])
// 调用后面的方法对数组的元素进行比较
// 这个比较函数是比较数据是否相等，如果相等，就判定为在其他数组中出现过，
// 就不保留，因为这个数据就不符合对称差，其实后面一个函数就是用来判定这些数据是否相等
// 根据返回值的布尔值来进行判定

var objects = [
  { x: 1, y: 2 },
  { x: 2, y: 1 },
];
var others = [
  { x: 1, y: 1 },
  { x: 1, y: 2 },
];
var others2 = [
  { x: 1, y: 2 },
  { x: 3, y: 3 },
];
let e = _.xorWith(objects, others, others2, _.isEqual);
console.log(e);
